import sys
import logging


# 创建一个类，用于重定向 stdout 到日志和控制台
class Logger:
    def __init__(self):
        self.terminal = sys.stdout  # 保存原始 stdout
        self.log_path = None  # 默认不指定日志文件路径
        self.file_handler = None  # 文件处理器
        self.console_handler = logging.StreamHandler(self.terminal)  # 控制台输出

        # 配置日志格式
        self.formatter = logging.Formatter(
            fmt='%(asctime)s - %(levelname)s - %(message)s',  # 日志格式
            datefmt='%Y-%m-%d %H:%M:%S'  # 时间格式
        )
        self.console_handler.setFormatter(self.formatter)

        # 获取全局日志对象
        self.log = logging.getLogger()
        self.log.setLevel(logging.INFO)  # 设置日志级别
        # self.log.addHandler(self.console_handler)  # 默认不输出到控制台

        self.console_output_enabled = False  # 默认不输出到控制台
    def _ensure_file_handler(self):
        """
        确保文件处理器已创建（延迟创建文件处理器）
        """
        if self.file_handler is None and self.log_path:
            self.file_handler = logging.FileHandler(self.log_path, encoding='utf-8')
            self.file_handler.setFormatter(self.formatter)
            self.log.addHandler(self.file_handler)

    def write(self, message):
        if message.strip():  # 跳过空行
            self._ensure_file_handler()  # 确保文件处理器已创建
            self.log.info(message)  # 写入日志文件（和控制台，视模式而定）

    def flush(self):
        pass  # 保持与原始 stdout 的 flush 一致

    def set_log_path(self, path):
        """
        动态设置日志文件路径，不会立即创建文件，只有写入时才会生成
        """
        self.log_path = path
        if self.file_handler:  # 如果已有文件处理器，切换路径
            self.log.removeHandler(self.file_handler)
            self.file_handler = None  # 延迟重新创建
        print(f"日志路径已切换到: {path}")

    def enable_console_output(self):
        """
        启用日志同时输出到控制台
        """
        if not self.console_output_enabled:
            self.log.addHandler(self.console_handler)
            self.console_output_enabled = True
            print("已启用控制台日志输出")

    def disable_console_output(self):
        """
        禁用日志同时输出到控制台
        """
        if self.console_output_enabled:
            self.log.removeHandler(self.console_handler)
            self.console_output_enabled = False
            print("已禁用控制台日志输出")

    def restore_stdout(self):
        """
        恢复原始 stdout 并关闭日志功能
        """
        if self.file_handler:
            self.log.removeHandler(self.file_handler)
        if self.console_output_enabled:
            self.log.removeHandler(self.console_handler)
        sys.stdout = self.terminal  # 恢复原始 stdout
        print("恢复到原始打印")

def reprint2log_start():
    # 替换 sys.stdout
    sys.stdout = Logger()
    sys.stdout.set_log_path('ali_record_log.txt')

if __name__ == '__main__':
    # 测试日志输出
    print("这是一个测试日志：你好，世界！")

    # 切换日志路径（不会立即创建文件）
    sys.stdout.set_log_path('new_log.txt')
    print("这条日志会写入新文件。")

    # 启用同时输出到控制台
    sys.stdout.enable_console_output()
    print("现在日志同时输出到控制台和文件。")

    # 禁用控制台输出
    sys.stdout.disable_console_output()
    print("现在日志仅输出到文件，不再显示在控制台。")

    # 恢复原始 stdout
    sys.stdout.restore_stdout()
    print("恢复后，这条信息不会写入日志文件，也不会受控制台日志模式影响。")
